package com.example.thread;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;
import java.util.logging.Handler;

/**
 * 测试线程池
 */
public class Executor {

    /**
     * corePoolSize:指定了线程池中的线程数量，它的数量决定了添加的任务是开辟新的线程去执行，还是放到workQueue任务队列中去；
     * maximumPoolSize:指定了线程池中的最大线程数量，这个参数会根据你使用的workQueue任务队列的类型，决定线程池会开辟的最大线程数量；
     * keepAliveTime:当线程池中空闲线程数量超过corePoolSize时，多余的线程会在多长时间内被销毁；
     * unit:keepAliveTime的单位
     * workQueue:任务队列，被添加到线程池中，但尚未被执行的任务；它一般分为直接提交队列、有界任务队列、无界任务队列、优先任务队列几种；
     * threadFactory:线程工厂，用于创建线程，一般用默认即可；
     * handler:拒绝策略；当任务太多来不及处理时，如何拒绝任务；
     */
    private static ExecutorService pool = new ThreadPoolExecutor(3, 3,
            1000, TimeUnit.MILLISECONDS
            , new SynchronousQueue<Runnable>(), Executors.defaultThreadFactory()
            ,new ThreadPoolExecutor.AbortPolicy());

    public static void main(String[] args) {
        List<Integer> ids = new ArrayList<>();
        //ids.add(1);
        //ids.add(2);
        //ids.add(3);
        //ids.add(4);
        //ids.add(5);
        //ids.add(6);
        //ids.add(7);
        //ids.add(8);
        //ids.add(9);
        new Executor().executor(ids);
    }

    public void executor(List<Integer> ids){
        List<Integer> one = new ArrayList<>();
        List<Integer> two = new ArrayList<>();
        List<Integer> three = new ArrayList<>();
        for(int i=0; i<ids.size(); i++){
            if(i%3==0){
                one.add(ids.get(i));
            }
            if(i%3==1){
                two.add(ids.get(i));
            }
            if(i%3==2){
                three.add(ids.get(i));
            }
        }

        List<List> list = new ArrayList<>();
        list.add(one);
        list.add(two);
        list.add(three);
        for(List i : list) {
            pool.execute(() -> {
                List<Integer> ii = i;
                if(ii == null || ii.size() == 0){
                   ii = new ArrayList<>();
                   ii.add(11);
                   ii.add(22);
                   ii.add(33);
                }
                System.out.println(ii);
            });
        }
    }
}
